﻿using System;
using System.Collections.Generic;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using WLMCoreLibrary;
using SAW_Core;
using System.Configuration;

namespace SAW
{
    public partial class ModuloPOS : System.Web.UI.Page
    {
        dbConnector ConexionDB;
        protected void Page_Load(object sender, EventArgs e)
        {
            ConexionDB = new dbConnector();
            //FuncionesLocales.CheckPagePermision(ref ConexionDB);
            

            if (!IsPostBack)
            {
                CuentaBancariaCollection cuentas = new CuentaBancariaCollection(true, ConexionDB);
                idCuentaPago.DataTextField = "alias2";
                idCuentaPago.DataValueField = "id";
                idCuentaPago.DataSource = cuentas.Elementos;
                idCuentaPago.DataBind();
                
                //idCuentaPago.SelectedValue = ConfigurationManager.AppSettings["idCuentaPOS"];
            }

            if (Request.QueryString["listado"] != null)
            {
                ListadoJSON();
            }
FuncionesLocales.ManejarMensaje();
            if (Request.QueryString["listaGrid"] != null)
            {
                panelListadoPOS.Visible = true;
                PanelAltaPOS.Visible = false;
               
            }

            if (Request["idCotizacion"] != null)
            {
                if (Request["impresion"] != null)
                {
                    GenerarPDFDocumento(Convert.ToInt32(Request["idCotizacion"]), "POSImpresion.xsl", true);
                }
                
                    panelResultadoVenta.Visible = true;
                    panelListadoPOS.Visible = false;
                    PanelAltaPOS.Visible = false;
                    labelDetalle.Text = detalleVEnta(Convert.ToInt32(Request["idCotizacion"]), "CotizacionImpresion.xsl");
                    idRegistroPOS.Value = Request["idCotizacion"];
                    Response.Write("<script>" +
               "$(document).ready(function () {" +
                        //"            alert(" + Request.QueryString["idCotizacion"] + ");" +
               "            PostPrintPOS(" + Request.QueryString["idCotizacion"] + ");" +
               "        });" +
               "</script>");
            }
            
        }

        protected void guardarPOS_Click(object sender, EventArgs e)
        {
            GuardarCotizacion();
        }

        protected void ListadoJSON()
        {


            string FieldList = "SELECT C.id,C.NoPedido,DATE_FORMAT(c.FechaCreacion,'%d-%m-%Y'),NombreCliente,NombreComercialCliente,CONCAT('$ ',CAST(Format(Total,2) AS CHAR)) as Totala,  CONCAT('$ ',CAST(Format(saldoPagado,2) AS CHAR)) as pagado,CONCAT('$ ',CAST(Format(SaldoPendiente,2) AS CHAR)) as pendiente,if(C.status=0,'critic','ok') as rowstatus " +
            " FROM COTIZACIONES C LEFT JOIN Clientes CL ON CL.id=C.idCliente ";
            int dataPage = Convert.ToInt32(Request["page"]);
            int rowsPerPage = Convert.ToInt32(Request["rp"]);
            string sortname = Request["sortname"];

            string sortorder = Request["sortorder"];
            if (sortname == null) sortname = "id";
            if (sortorder == null) sortorder = "desc";
            string sort = "ORDER BY " + sortname + " " + sortorder;
            if (dataPage == 0) dataPage = 1;
            if (rowsPerPage == 0) rowsPerPage = 50;
            int start = ((dataPage - 1) * rowsPerPage);
            string where = "";
            string qtype = Request["qtype"];

            string clienteFiltrado = "";
            
            
            clienteFiltrado = clienteFiltrado + "  ";
            string filtroFechas = "";
            if (Request["fechaInicial"] != null && Request["fechaFinal"] != null)
                filtroFechas = " AND (C.fechaCreacion BETWEEN '" + Convert.ToDateTime(Request["fechaInicial"]).ToString("yyyy-MM-dd 00:00:01") + "' AND '" + Convert.ToDateTime(Request["fechaFinal"]).ToString("yyyy-MM-dd 23:59:59") + "') ";
            if (Request["query"] != null) where = " WHERE " + qtype + " LIKE '%" + Request["query"] + "%' AND C.idListaPrecios=0  AND C.activo=1 " + clienteFiltrado+filtroFechas;
            else where = " WHERE C.idListaPrecios=0 AND C.status=1 AND C.activo=1 " + clienteFiltrado + filtroFechas;
            string limit = "LIMIT " + start + ", " + rowsPerPage;

            string strCommand = FieldList + where + sort + " " + limit;
            //Response.Write(strCommand);
            WLMFunctions.JsonGrid(strCommand, FieldList, where, dataPage);

        }

        protected void GuardarCotizacion()
        {
            Venta cotizacion;
            Cliente cliente;
            if (idClientePOS.Value == "0")
            {
                cliente = new Cliente(ref ConexionDB);
                cliente.NombreComercial = Request["nombreClientePOS"];
                cliente.RazonSocial = Request["nombreClientePOS"];
                cliente.Save();
            }
            else
                cliente = new Cliente(Convert.ToInt32(idClientePOS.Value),ref ConexionDB);

            cotizacion = new Venta(ref ConexionDB);

            
            cotizacion.idCliente = cliente.id;
            cotizacion.NombreCliente = cliente.RazonSocial;
            cotizacion.NombreComercialCliente = cliente.NombreComercial;
            cotizacion.RFCCliente = cliente.RFC;
            cotizacion.F_Calle = cliente.DireccionFacturacion.Calle;
            cotizacion.F_NumeroExterior = cliente.DireccionFacturacion.NumeroExterior;
            cotizacion.F_NumeroInterior = cliente.DireccionFacturacion.NumeroInterior;
            cotizacion.F_Colonia = cliente.DireccionFacturacion.Colonia;
            cotizacion.F_Municipio = cliente.DireccionFacturacion.Municipio;
            cotizacion.F_Ciudad = cliente.DireccionFacturacion.Ciudad;
            cotizacion.F_Estado = cliente.DireccionFacturacion.Estado;
            cotizacion.F_CP = cliente.DireccionFacturacion.CP;

            cotizacion.FechaVencimiento = DateTime.Now;
            cotizacion.TiempoEntrega = "Mismo Dia";
            cotizacion.CondicionesPago = "Efectivo";
            cotizacion.Observaciones = ObservacionesVenta.Text;
            cotizacion.SubTotal = WLMFunctions.MonedaADecimal(SubTotalCotizacionPOS.Text);
            cotizacion.Descuento = WLMFunctions.MonedaADecimal(DescuentoCotizacionPOS.Text);
            //cotizacion.DescuentoPorcentaje =WLMFunctions.MonedaADecimal( DescuentoPorcentaje.Text);
            cotizacion.IVA = WLMFunctions.MonedaADecimal(IVACotizacionPOS.Text);
            cotizacion.Total = WLMFunctions.MonedaADecimal(TotalCotizacionPOS.Text);
            cotizacion.idListaPrecios = 0;
            cotizacion.idCondicionesPago = 1;
            cotizacion.DiasCredito = new Condicionespago(cotizacion.idCondicionesPago,ref ConexionDB).dias;
            cotizacion.IdAlmacen = Convert.ToInt32(ConfigurationManager.AppSettings["idAlmacenPOS"]);
            //           cotizacion.Save();
            int NumeroConceptos = Convert.ToInt32(Request["cantidadConceptosPOS"]);
            for (int x = 1; x <= NumeroConceptos; x++)
            {
                GuardarConcepto(cotizacion, x);

            }

            string mensaje = "Se ha dado de alta correctamente la cotizacion para el cliente <b>" + cotizacion.NombreCliente + "</b> por un total de <b>" + cotizacion.Total.ToString("C") + "</b>";
            Session["mensajeCotizacion"] = mensaje;
            Session["mensaje"] = mensaje;
            //ResultadoProcesoCotizacion.Text = mensaje;
            mensaje = Server.UrlEncode(mensaje);



            cotizacion.SaldoPendiente = cotizacion.Total;
            cotizacion.Save();
            
            int idCotizacionActual = cotizacion.id;



            cotizacion = new Venta(idCotizacionActual, true,ref ConexionDB);
            cotizacion.ConvertirAPedido();
            cotizacion.Status = 3;
            cotizacion.Save();
            cotizacion = new Venta(idCotizacionActual, true,ref ConexionDB);
            cotizacion.GenerarSalida();
            cotizacion.Save();

            RegistrarPagoCotizacion(cotizacion.id, Convert.ToInt32(idCuentaPago.SelectedValue), cotizacion.Total, DateTime.Now, "", 3);

            ConexionDB.CloseConnection();

            Response.Redirect("/ModuloPOS.aspx?idCotizacion=" + cotizacion.id);//+"&mensaje="+mensaje);

        }

        protected void GuardarConcepto(Venta cotizacion, int x)
        {
            if (Request["idProductoConceptoPOS" + x] != "0")
            {
                //Response.Write(Request["idProductoConcepto" + x]+Request["ConceptoEliminado" + x] + Request["cantidadConcepto" + x]);
                if (Request["ConceptoEliminadoPOS" + x] != "true" || Request["cantidadConceptoPOS" + x] != "0")
                {
                    VentaItem item;
                    item = new VentaItem(ref ConexionDB);

                    item.idCotizacion = cotizacion.id;
                    item.idProducto = Convert.ToInt32(Request["idProductoConceptoPOS" + x]);
                    item.UnidadMedida = Request["unidadConceptoPOS" + x];
                    item.Clave = Request["claveConceptoPOS" + x];
                    item.Categoria = Request["categoriaConceptoPOS" + x];
                    item.Linea = Request["lineaConceptoPOS" + x];
                    item.Marca = Request["marcaConceptoPOS" + x];
                    item.Descripcion = Request["descripcionConceptoPOS" + x];
                    item.Precio = WLMFunctions.MonedaADecimal(Request["precioConceptoPOS" + x]);
                    item.Cantidad = WLMFunctions.MonedaADecimal(Request["cantidadConceptoPOS" + x]);
                    item.Save();
                }
                else
                {
                    VentaItem item;
                    item = new VentaItem(Convert.ToInt32(Request["ConceptoCotizacionId" + x]),ref ConexionDB);
                    Response.Write(x + "Eliminado");
                    item.Delete();
                }
            }
        }


        protected void RegistrarPagoCotizacion(int idCotizacion, int idCuenta, decimal MontoPago, DateTime fechaPago, string noDocumento, int tipoDeposito)
        {
            Venta cotizacion = new Venta(idCotizacion,ref ConexionDB);
            MovimientoBancario movimiento = new MovimientoBancario(ref ConexionDB);
            CuentaBancaria cuenta = new CuentaBancaria(idCuenta,ref ConexionDB);
            Cliente cliente = new Cliente(cotizacion.idCliente,ref ConexionDB);
            VentaPago pagoCotizacion = new VentaPago(ref ConexionDB);
            movimiento.monto = MontoPago;
            movimiento.fechaAplicacion = fechaPago;
            movimiento.descripcion = movimiento.Concepto = "Pago a Pedido No. " + cotizacion.NoPedido + " [" + cotizacion.NombreCliente + "]";
            movimiento.nombreDepositante = cotizacion.NombreCliente;
            movimiento.nombreDepositario = cotizacion.NombreCliente;
            movimiento.deposito = true;
            movimiento.retiro = false;
            movimiento.idCotizacion = cotizacion.id;
            movimiento.NoDocumento = noDocumento;
            movimiento.idCuentaBancaria = cuenta.id;
            movimiento.TipoMovimiento = tipoDeposito;
            movimiento.Save();
            cuenta.ProcesarMovimientoBancario(movimiento);
            pagoCotizacion.SaldoAntesPago = cotizacion.SaldoPendiente;
            cotizacion.SaldoPendiente -= movimiento.monto;
            cotizacion.SaldoPagado += movimiento.monto;
            cotizacion.Save();
            pagoCotizacion.SaldoDespuesPago = cotizacion.SaldoPendiente;
            pagoCotizacion.idCotizacion = cotizacion.id;
            pagoCotizacion.idMovimientoBancario = movimiento.id;
            pagoCotizacion.FechaRealizacion = fechaPago;
            pagoCotizacion.TotalPago = movimiento.monto;

            cliente.SaldoActual -= movimiento.monto;
            cliente.FechaUltimoPago = movimiento.fechaAplicacion;
            cliente.Save();




            pagoCotizacion.Save();

            Response.Write("El Pago ha sido realizado a El Documento No. " + cotizacion.id + " con numero de Pedido " + cotizacion.NoPedido + "<br>Por un total de " + movimiento.monto.ToString("C") + " a la cuenta '" + cuenta.alias + "'");
            //ConexionDB.CloseConnection();
            //Response.End();

        }

        protected string GenerarPDFDocumento(int noDocumento, string archivoTransformacion, bool mostrarPDF)
        {
            Venta cotizacion = new Venta(noDocumento, true,ref ConexionDB);
            cotizacion.NoSalida = cotizacion.NoPedido;
            cotizacion.GenerarArchivoXML();
            string rutaArchivos = "";
            rutaArchivos += "CotizacionesXML/" + noDocumento.ToString("00000") + "/";
            string nombreArchivo = cotizacion.id.ToString("00000");

            PDFCreator pdf = new PDFCreator();
            //Generando un 
            string tipoPdf = "Remision";
            string nombreArchivoSalida = "";
            List<ParametroTransformacionXML> parametros = new List<ParametroTransformacionXML>();
            parametros.Add(new ParametroTransformacionXML("tipoImpresion", "4"));

            nombreArchivoSalida = cotizacion.NoSalida.ToString("00000");

            pdf.CrearPDFdeHTML(WLMFunctions.TransformXML(ConfigurationManager.AppSettings["siteURL"] + rutaArchivos + nombreArchivo + ".xml", ConfigurationManager.AppSettings["siteURL"] + ConfigurationManager.AppSettings["XMLStyleFolder"] + archivoTransformacion, parametros), tipoPdf + "-" + nombreArchivoSalida, rutaArchivos, false, 12,10,10,10, 9, true, 204, 792);
            return ConfigurationManager.AppSettings["sitePath"] + rutaArchivos + tipoPdf + "-" + nombreArchivoSalida + ".pdf";

        }

        protected string detalleVEnta(int noDocumento, string archivoTransformacion)
        {
            Venta cotizacion = new Venta(noDocumento, true,ref ConexionDB);
            cotizacion.NoSalida = cotizacion.NoPedido;
            cotizacion.GenerarArchivoXML();
            string rutaArchivos = "";
            rutaArchivos += "CotizacionesXML/" + noDocumento.ToString("00000") + "/";
            string nombreArchivo = cotizacion.id.ToString("00000");

            PDFCreator pdf = new PDFCreator();
            //Generando un 
            string tipoPdf = "Remision";
            string nombreArchivoSalida = "";
            List<ParametroTransformacionXML> parametros = new List<ParametroTransformacionXML>();
            parametros.Add(new ParametroTransformacionXML("tipoImpresion", "4"));

            nombreArchivoSalida = cotizacion.NoPedido.ToString("00000");

            return WLMFunctions.TransformXML(ConfigurationManager.AppSettings["siteURL"] + rutaArchivos + nombreArchivo + ".xml", ConfigurationManager.AppSettings["siteURL"] + ConfigurationManager.AppSettings["XMLStyleFolder"] + archivoTransformacion, parametros);
        }

    }
}